翻译自:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization
使用案例
- Hive作为表存储层。这是在使用Apache Pig,MapReduce和其他MMP数据库(Cloudera Impala,Facebook Presto,Spark SQL等)时很常见。这种情况下,Hive提供了表抽象和存储上的元数据(尤其是对于HDFS)。这些用户可以直接访问HDFS和metastore服务器(它为Hive元数据提供了访问接口)。HDFS的访问是通过HDFS访问控制授权的,而元数据的访问需要通过Hive配置来授权。
- Hive作为SQL引擎。这是Hive最常见的情况。下面是对于SQL用户和BI工具来说的”Hive界面”,可以分为两个子文件夹:
a. Hive命令行用户。这些用户拥有直接访问HDFS和Hive metastore的权限,这跟案例1很相似。注意,不久后Hive CLI会正式被弃用以支持Beeline。
b. ODBC/JDBC和其他HiveServer2 API的用户(Beeline CLI就是一个例子)。这些用户可以通过HiveServer2访问所有数据和元数据,但不能直接访问HDFS或者metastore。
权限模型概况
基于存储的Metastore Server权限控制
在案例1和案例2a中,用户可以不经Hive配置控制直接访问数据。而在真正访问表的存储文件时,HDFS访问权限作为其中一个权限数据源,会对用户操作进行访问校验。通过启用基于存储的Metastore Server权限控制,你可以将它作为唯一数据源,保证数据一致性和元数据授权策略。为了要控制对库/表/分区等元对象的访问, 该权限模型会检查你是否在文件系统上对应的目录有相应的权限。在确保查询以终端用户方式运行的情况下,你也可以通过HiveServer2(在下文的案例2b)来保护访问接口。(在HiveServer2 配置中的hive.server2.enable.doAs 选项应该为true,这也是默认值)。
注意,使用HDFS ACL(在Hadoop 2.4以上版本可用)你可以很灵活地控制文件系统的权限,同时为基于存储的权限控制提供更多的灵活性。这项功能在Hive 0.14可用(HIVE-7583)。
基于SQL标准的HiveServer2权限控制
虽然基于存储的权限控制可以提供数据库/表/分区级别的权限控制,但更细粒度的权限控制,比如列和视图就没办法做到了,因为文件系统的权限控制是到文件级别的,要求精确权限控制的前提是,有一个能够提供用户有权限(有需要)访问的列和行的数据服务器。但对于文件系统来说,整个文件都是为用户服务的。HiveServer2满足了这个需求,因为它的API有行和列的概念(通过使用SQL),能够仅提供你的查询需要的行和列。
基于SQL标准的权限控制(在Hive 0.13.0引入,HIVE-5837)可以用于实现精确权限控制。它基于SQL标准使用大家熟悉的grant/revoke语句来控制访问。这需要通过HiveServer2配置来启用。
注意该权限模型不能用于案例2a(Hive命令行),这是因为用户可以直接访问HDFS,并能理所当然地绕过基于SQL标准的权限校验,甚至将它关闭。这种情况下关闭它可以避免给用户安全访问的错觉。
默认的Hive授权(遗留模式)
Hive默认的授权模型是Hive早期版本曾使用过的。然后这个模型缺乏完整的访问控制模式,留下了许多安全隐患。比如,需要将权限授予一个未定义的用户,或者任何用户都可以授权自己访问数据表或数据库的权限。这个模型与基于SQL标准的授权模型相似,也提供了基于grant/revoke语句的访问控制。然而,该访问控制与基于SQL标准的授权模型不同,并且它们也不兼容。该模型对于Hive命令行用户同样适用。不过,由于在上述基于SQL标准授权模型的讨论中提到的原因,该模型用在Hive命令行并不安全。
满足多种案例的授权需求
使用基于存储的授权模型是满足以上所有案例的简单方式。如果你需要对SQL用户进行精准的访问控制,你也可以同时在HiveServer2启用基于SQL标准的授权模型。也就是说,你可以对metastore API调用启用基于存储的授权模型,同时对HiveServer2启用基于SQL标准的授权模型。
本文是原创文章,转载请注明:时间与精神的小屋 - [译]Hive权限控制官方文档